package com.managed.bean;

import com.marlboroug.entity.Users;
import com.marlboroug.users.UsersManagerRemote;
import com.util.PasswordHash;
import java.security.NoSuchAlgorithmException;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

/**
 * Gestion de l'enregistrement.
 *
 * @author Cyril Schumacher
 */
@ManagedBean(name = "registration")
public class RegistrationBean {

    // <editor-fold defaultstate="collapsed" desc="Membres.">
    /**
     * Gestion des utilisateurs.
     */
    @EJB
    private UsersManagerRemote _usersManager;
    /**
     * Informations saisies par l'utilisateur.
     */
    private Users _user;
    /**
     * Confirmation du mot de passe saisie par l'utilisateur.
     */
    private String passwordConfirmation;
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Accesseurs/Mutateurs.">
    /**
     * Obtient l'utilisateur.
     *
     * @return Retourne un utilisateur.
     */
    public Users getUser() {
        return _user;
    }

    /**
     * Définit l'utilisateur.
     *
     * @param user Utilisateur.
     */
    public void setUser(Users user) {
        _user = user;
    }

    /**
     * Obtient le mot de passe de confirmation.
     *
     * @return Retourne le mot de passe de confirmation.
     */
    public String getPasswordConfirmation() {
        return passwordConfirmation;
    }

    /**
     * Définit le mot de passe de confirmation.
     *
     * @param passwordConfirmation Mot de passe de confirmation.
     */
    public void setPasswordConfirmation(String passwordConfirmation) {
        this.passwordConfirmation = passwordConfirmation;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    /**
     * Vérifie si le mot de passe de confirmation est identique au mot de passe.
     *
     * @param context Informations contextuelles associées au traitement de la
     * requête.
     * @return Retourne TRUE si le mot de passe de confirmation est identique,
     * FALSE sinon.
     */
    private Boolean _checkPassword(FacesContext context) {
        if (_user.getPassword().equals(getPasswordConfirmation())) {
            return true;
        }

        context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Le mot de passe n'est pas identique au mot de passe de confirmation.",
                null));
        return false;
    }

    /**
     * Sauvegarde l'utilisateur.
     *
     * @param context Informations contextuelles associées au traitement de la
     * requête.
     * @return Retourne TRUE si l'utilisateur a bien été enregistré, FALSE
     * sinon.
     */
    private Boolean _saveUser(FacesContext context) {
        if (_usersManager.create(getUser())) {
            return true;
        }

        // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
        // l'utilisateur.
        context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Une erreur est survenue lors de la création de votre compte.",
                null));
        return false;
    }

    /**
     * Enregistre l'utilisateur.
     *
     * @return Retourne "success" si l'utilisateur a été enregistré, "failure"
     * sinon.
     * @throws java.security.NoSuchAlgorithmException
     */
    public String save() throws NoSuchAlgorithmException {
        // Récupère les informations contextuelles associées au traitement 
        // de la requête pour pouvoir gérer les erreurs/informations.
        FacesContext context = FacesContext.getCurrentInstance();

        // Vérifie si le mot de passe est identique au mot de passe de 
        // confirmation.
        if (_checkPassword(context) == true) {

            _user.setPassword(PasswordHash.crypt(_user.getPassword()));
            // Sauvegarde l'utilisateur.
            if (_saveUser(context) == true) {
                return "success";
            }
        }

        return "failure";
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Initialisation de la classe.">
    /**
     * Initialise la classe après l'injection de dépendance.
     *
     * @see javax.annotation.PostConstruct
     */
    @PostConstruct
    public void initialize() {
        if (_user == null) {
            _user = new Users();
        }
    }
    // </editor-fold>
}
